﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotas.Core;
using System.Security.Cryptography;

namespace GestorDeFlotasDesktop.AbmUsuario
{
    public partial class DatosUsuario : FormDatosBase
    {
        const string DummyPassword = "password";

        private Usuario MyUsuario { get; set; }

        public DatosUsuario(ModoAbm modoAbm)
            : base(modoAbm)
        {
            InitializeComponent();
        }

        public DatosUsuario(ModoAbm modoAbm, Usuario usuario)
            : this(modoAbm)
        {
            MyUsuario = usuario;
        }

        private void DatosUsuario_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'gD1C2012DataSet.TL_Roles' table. You can move, or remove it, as needed.
            this.tL_RolesTableAdapter.FillByActivos(this.gD1C2012DataSet.TL_Roles);
            this.SetFormText();

            if (this.modoAbm == ModoAbm.Alta)
            {
                this.MyUsuario = new Usuario();
                this.chkActivo.Enabled = false;
            }
            else if (this.modoAbm == ModoAbm.Modificacion)
            {
                this.txtUsername.Enabled = false;
                PopularControles(this.MyUsuario);
            }
        }
        
        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            if (this.modoAbm == ModoAbm.Alta)
            {
                this.txtUsername.Text = string.Empty;
            }

            this.txtPassword.Text = string.Empty;
            LimpiarRolesSeleccionados();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            List<string> camposInvalidos = ChequearCamposObligatorios();
            if (!(camposInvalidos.Count > 0))
            {
                PopularUsuario();
                if (this.modoAbm == ModoAbm.Alta)
                {
                    try
                    {
                        MyUsuario.Crear();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                        return;
                    }
                }
                else if (this.modoAbm == ModoAbm.Modificacion)
                {
                    MyUsuario.Modificar();
                    if (MyUsuario.Username.Equals(Sesion.UsuarioLogueado.Username))
                    {
                        MessageBox.Show("Ha modificado datos del usuario logueado. La aplicación se reiniciará para reflejar los cambios.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        Application.Restart();
                    }
                }

                this.DialogResult = DialogResult.OK;
            }
            else
            {
                MostrarMensajeCamposObligatorios(camposInvalidos);
            }
        }

        private void PopularUsuario()
        {
            MyUsuario.Username = this.txtUsername.Text;
            if (!this.txtPassword.Text.Equals(DummyPassword))
            {
                MyUsuario.SetPassword(this.txtPassword.Text);
            }
            MyUsuario.Activo = this.chkActivo.Checked;
            MyUsuario.Roles.Clear();

            List<DataGridViewRow> checkedRows = GetRolesSeleccionados();
            if (checkedRows.Count > 0)
            {
                MyUsuario.Roles.AddRange(checkedRows.Select(r => Convert.ToInt32(r.Cells["rol_codigo"].Value)).ToList());
            }
        }

        private List<DataGridViewRow> GetRolesSeleccionados()
        {
            List<DataGridViewRow> checkedRows = new List<DataGridViewRow>();
            foreach (DataGridViewRow row in grdRoles.Rows)
            {
                if (Convert.ToBoolean(row.Cells["rol_seleccionado"].Value) == true)
                {
                    checkedRows.Add(row);
                }
            }
            return checkedRows;
        }

        private List<string> ChequearCamposObligatorios()
        {
            List<string> camposInvalidos = new List<string>();
            if (string.IsNullOrEmpty(this.txtUsername.Text))
            {
                camposInvalidos.Add("Username");
            }

            if (string.IsNullOrEmpty(this.txtPassword.Text))
            {
                camposInvalidos.Add("Password");
            }

            return camposInvalidos;
        }

        private void PopularControles(Usuario usuario)
        {
            this.txtUsername.Text = usuario.Username;
            this.txtPassword.Text = DummyPassword;
            this.chkActivo.Checked = usuario.Activo;
            PopularRoles(this.MyUsuario.Roles);
        }

        private void PopularRoles(List<int> idsRoles)
        {
            foreach (DataGridViewRow row in grdRoles.Rows)
            {
                if (idsRoles.Contains((Int32)row.Cells["rol_codigo"].Value))
                {
                    row.Cells["rol_seleccionado"].Value = true;
                }
            }
        }

        private void LimpiarRolesSeleccionados()
        {
            foreach (DataGridViewRow row in grdRoles.Rows)
            {
                if (Convert.ToBoolean(row.Cells["rol_seleccionado"].Value) == true)
                {
                    row.Cells["rol_seleccionado"].Value = false;
                }
            }
        }
    }
}
